package frsf.cidisi.exercise.modelo.situationCalculus;

import frsf.cidisi.exercise.modelo.util.Celda;
import frsf.cidisi.exercise.modelo.util.Laberinto;
import frsf.cidisi.exercise.modelo.util.Coordenada;
import frsf.cidisi.exercise.modelo.util.Salida;
import frsf.cidisi.faia.agent.Action;

import java.util.ArrayList;
import java.util.List;
import frsf.cidisi.faia.environment.Environment;


public class Ambiente extends Environment {

    public Ambiente() {
        this.environmentState = new AmbienteEstado();
    }

    @Override
    public AmbienteEstado getEnvironmentState() {
        return (AmbienteEstado) super.getEnvironmentState();
    }

    @Override
    public boolean agentFailed(Action action) {

        //TODO: Complete Method

        return false;
    }

    @Override
    public AgentePerception getPercept() {
        AgentePerception perception = new AgentePerception();
        
        AmbienteEstado ambiente = this.getEnvironmentState();
        
        //TODO: Complete Method
        Coordenada posicion = ambiente.getPosAgente();
        Celda cel = ambiente.getLaberinto().getCelda(posicion);
        List <Salida>salidas = ambiente.getListaSalidas();
        List <Coordenada>llaves = ambiente.getListaLlaves();
        
        perception.setParedN(cel.getParedNorte());
        perception.setParedS(cel.getParedSur());
        perception.setParedE(cel.getParedEste());
        perception.setParedO(cel.getParedOeste());
        
        for(Salida salida : salidas){
        	if(salida.getCoordenada().equals(posicion)){
        		perception.setSalida(true);
        		if(salida.getCerrada())
        			perception.setCerrada(true);
        		break;
        	}
        }
        
        for(Coordenada llave : llaves){
        	if(llave.equals(posicion)){
        		perception.setLlave(true);
        		break;
        	}
        }
        
        /*Laberinto laberinto = new Laberinto(ambiente.getLaberinto().getCeldas());
        perception.setLaberinto(laberinto);
        
        List<Coordenada> listaEntradas = new ArrayList<Coordenada>(ambiente.getListaEntradas());
        perception.setListaEntradas(listaEntradas);
        
        List<Coordenada> listaLlaves = new ArrayList<Coordenada>(ambiente.getListaLlaves());
        perception.setListaLlaves(listaLlaves);
       
        List<Salida> listaSalidas = new ArrayList<Salida>(ambiente.getListaSalidas());
        perception.setListaSalidas(listaSalidas);*/
        
       // Return the perception
       return perception;
    }
    
    @Override
    public String toString() {
        return this.environmentState.toString();
    }
}
